/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mainPackage;

import interfaces.ChoixDeNomInterface;
import interfaces.ControleurInterface;
import interfaces.VuInterface;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Random;
import logo.FeuilleDessin;
import logo.GereTourThread;
import logo.JPanelNomTortue;
import tortues.Tortue;
import tortues.TortueAmelioree;
import tortues.TortueBalle;

/**
 *
 * @author Quentin
 */
public class ControleurTortue implements ControleurInterface, ChoixDeNomInterface {

    private Tortue tortueCourante = null;
    private GereTourThread managerTour = null;
    private FeuilleDessin mFeuille = null;
    private VuInterface mVuInterface = null;

    public ControleurTortue() {
    }

    public VuInterface getVuInterface() {
        return mVuInterface;
    }

    public void setVuInterface(VuInterface mVuInterface) {
        this.mVuInterface = mVuInterface;
    }

    @Override
    public void setTortueCourante(Tortue tortueCourante) {
        this.tortueCourante = tortueCourante;
    }

    @Override
    public void setFeuille(FeuilleDessin mFeuille) {
        this.mFeuille = mFeuille;
    }

    @Override
    public void bouttonPresse(String commande, String valeurEntre) {
        switch (commande) {
            case "Avancer":
                try {
                    int v = Integer.parseInt(valeurEntre);
                    tortueCourante.avancer(v);
                } catch (NumberFormatException ex) {
                    System.err.println("ce n'est pas un nombre : " + valeurEntre);
                }
                break;
            case "Reculer":
                try {
                    int v = Integer.parseInt(valeurEntre);
                    tortueCourante.reculer(v);
                } catch (NumberFormatException ex) {
                    System.err.println("ce n'est pas un nombre : " + valeurEntre);
                }
                break;
            case "Droite":
                try {
                    int v = Integer.parseInt(valeurEntre);
                    tortueCourante.droite(v);
                } catch (NumberFormatException ex) {
                    System.err.println("ce n'est pas un nombre : " + valeurEntre);
                }
                break;
            case "Gauche":
                try {
                    int v = Integer.parseInt(valeurEntre);
                    tortueCourante.gauche(v);
                } catch (NumberFormatException ex) {
                    System.err.println("ce n'est pas un nombre : " + valeurEntre);
                }
                break;
            case "Lever":
                tortueCourante.leverCrayon();
                break;
            case "Baisser":
                tortueCourante.baisserCrayon();
                break;
            case "Proc1":
                proc1();
                break;
            case "Proc2":
                proc2();
                break;
            case "Proc3":
                proc3();
                break;
            case "Play":
                lancer();
                break;
            case "Effacer":
                effacer();
                break;
            case "Ajouter Tortue":
                ajouterUneTortue();
                break;
            case "Quitter":
                quitter();
                break;
        }
    }

    /**
     * les procedures Logo qui combine plusieurs commandes..
     */
    private void quitter() {
        System.exit(0);
    }

    public void proc1() {
        tortueCourante.etoile(7, 100);
    }

    public void proc2() {
        tortueCourante.poly(60, 8);
    }

    public void proc3() {
        tortueCourante.spiral(50, 40, 6);
    }

    // efface tout et reinitialise la mFeuille
    public void effacer() {
        mFeuille.reset();
        mFeuille.repaint();

        // Replace la tortue au centre
        Dimension size = mFeuille.getSize();
        tortueCourante.setPosition(size.width / 2, size.height / 2);
    }

    public void lancer() {
        creerLeJeuTortueDeplace();
        unTour();
    }

    private synchronized void unTour() {
        if (managerTour != null && managerTour.getContinuer()) {
            managerTour.setContinuer(false);
        } else {
            managerTour = null;
            managerTour = new GereTourThread(mFeuille);
            managerTour.start();
        }
    }

    public void ajouterUneTortue() {
        System.out.println("Ajouter une tortue");
        JPanelNomTortue mJPanelNomTortue = new JPanelNomTortue();
        mJPanelNomTortue.setInterface(this);
        mJPanelNomTortue.setVisible(true);

    }

    @Override
    public void onNomChoisiPositionRandom(String nomTortue) {
        if (nomTortue != null && nomTortue.length() > 0) {
            TortueAmelioree t = new TortueAmelioree(nomTortue);
            Random r = new Random();
            t.setPosition(r.nextInt(mFeuille.getWidth()), r.nextInt(mFeuille.getHeight()));
            t.addArrayTortue(mFeuille.getMesTortues());

            for (int i = 0; i < mFeuille.getMesTortues().size(); i++) {
                mFeuille.getTortueParPosition(i).addTortue(t);
            }
            mFeuille.addTortue(t);
            mFeuille.updateUI();
        }
    }

    @Override
    public void onNomNonChoisi() {
        System.out.println("Aucun nom n'a été choisis.");
    }

    @Override
    public void onNomChoisi(String nomTortue, int x, int y) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Tortue getTortueCourante() {
        return tortueCourante;
    }

    @Override
    public FeuilleDessin getFeuille() {
        return mFeuille;
    }

    @Override
    public FeuilleDessin creerLeJeuTortueDeplace() {
        mFeuille = new FeuilleDessin(); //500, 400);
        mFeuille.setBackground(Color.white);
        mFeuille.setSize(new Dimension(FeuilleDessin.DIMX, FeuilleDessin.DIMY));
        mFeuille.setPreferredSize(new Dimension(600, 400));

        // Creation de la tortue
        Tortue tortue = new Tortue();
        for (int i = 0; i < 5; i++) {
            TortueAmelioree t = new TortueAmelioree("" + i);
            t.setPosition(500 / 2 + i * 10, 400 / 2 + i * 10);
            t.setNumEquipe(TortueAmelioree.ramdomTortueAmelioree.nextInt(TortueAmelioree.NB_EQUIPE) + 1);
            //t.droite(i*90);
            mFeuille.addTortue(t);
        }
        TortueBalle tt = new TortueBalle();
        tt.setPosition(100, 100);
        mFeuille.addTortue(tt);

        for (int i = 0; i < mFeuille.getMesTortues().size(); i++) {
            mFeuille.getTortueParPosition(i).addArrayTortue(mFeuille.getMesTortues());
        }

        // Deplacement de la tortue au centre de la mFeuille
        tortue.setPosition(500 / 2, 400 / 2);

        tortueCourante = mFeuille.getTortueParPosition(1);
        mFeuille.addTortue(tortue);
        mFeuille.getTortueParPosition(0).setPossesseurBalle();

        return mFeuille;
    }
}
